# -*- coding: utf-8 -*-
"""
@Time： 2023/12/20 16:20
@Auth： gubei
@File：views.py
@IDE：PyCharm
@Description：用户API视图
"""
import pymysql
from fastapi import APIRouter, Depends, Request, Query, HTTPException, status
from sqlalchemy import func
from sqlalchemy.orm import Session

from api.user.serializers import UserRegisterSchema, UserPwdUpdate
from core.auth.oauth2 import get_current_user, get_password_hash
from core.db.database import get_db
from core.decorators import log_action
from core.models.models import User
from utils.response import R

router = APIRouter(dependencies=[Depends(get_current_user)])


@router.get("/current_user", summary='获取用户信息')
async def get_userinfo(request: Request, current_user: User = Depends(get_current_user)):
    """获取当前用户信息"""
    return R.suc(data=current_user.to_dict())


@router.get("/user/{user_id}", summary='根据ID获取用户信息')
@log_action('获取了用户ID为{user_id}的用户信息')
async def read_user(request: Request, user_id: int, db: Session = Depends(get_db)):
    """根据ID获取用户信息
    
    Args:
        request: 请求对象
        user_id: 用户ID
        db: 数据库会话
        
    Returns:
        用户信息
        
    Raises:
        HTTPException: 如果用户不存在
    """
    user = db.query(User).filter(User.id == user_id).first()
    if user is None:
        return R.not_found(msg=f"用户ID {user_id} 不存在")
    return R.suc(data=user.to_dict())


@router.get("/users", summary='获取所有用户信息')
@log_action('获取所有用户信息')
async def read_users(request: Request, page: int = Query(1, ge=1), pagesize: int = Query(10, ge=1, le=100), db: Session = Depends(get_db)):
    """获取用户列表（分页）
    
    Args:
        request: 请求对象
        page: 页码（从1开始）
        pagesize: 每页记录数
        db: 数据库会话
        
    Returns:
        分页的用户列表
    """
    offset = (page - 1) * pagesize
    users = db.query(User).offset(offset).limit(pagesize).all()
    total = db.query(func.count(User.id)).scalar()
    
    # 转换用户对象为字典
    user_dicts = [user.to_dict() for user in users]

    return R.paginate(data=user_dicts, total=total, page=page, page_size=pagesize)


@router.post('/user', summary='新增用户信息')
@log_action('创建了新用户{UserRegister.username}')
async def post_register(request: Request, UserRegister: UserRegisterSchema, db: Session = Depends(get_db)):
    """创建新用户
    
    Args:
        request: 请求对象
        UserRegister: 用户注册信息
        db: 数据库会话
        
    Returns:
        创建成功的消息
        
    Raises:
        HTTPException: 如果创建失败
    """
    try:
        # 检查用户名是否已存在
        existing_user = db.query(User).filter(User.userName == UserRegister.username).first()
        if existing_user:
            return R.err(msg=f"用户名 '{UserRegister.username}' 已存在")
            
        password = get_password_hash(UserRegister.password)

        # 创建一个新的用户，并关联指定的角色
        new_user = User(
            userName=UserRegister.username, 
            nickName=UserRegister.nickname,
            userPwd=password, 
            role_id=UserRegister.role
        )
        
        # 使用会话保存用户
        new_user.save(session=db)

        return R.suc(msg='创建用户成功')
    except pymysql.err.IntegrityError as e:
        # 捕获数据库完整性错误，可能是外键约束失败
        return R.err(msg="未找到对应的角色")
    except Exception as e:
        # 捕获其他异常
        return R.server_error(msg=f"创建用户失败: {str(e)}")


@router.put("/user/status", summary='更新用户状态')
@log_action('更新了ID为{user_id}的用户的状态')
async def update_user_status(request: Request, user_id: int, db: Session = Depends(get_db)):
    """更新用户状态（激活/禁用）
    
    Args:
        request: 请求对象
        user_id: 用户ID
        db: 数据库会话
        
    Returns:
        更新成功的消息
        
    Raises:
        HTTPException: 如果用户不存在
    """
    db_user = db.query(User).filter(User.id == user_id).first()
    if db_user is None:
        return R.not_found(msg=f"用户ID {user_id} 不存在")
        
    # 切换用户状态
    db_user.isActive = 0 if db_user.isActive else 1
    db.commit()
    
    status_text = "禁用" if db_user.isActive == 0 else "激活"
    return R.suc(msg=f'用户状态已更新为{status_text}')


@router.put("/user/pwd", summary='修改用户密码')
@log_action('修改了ID为{userPwdUpdate.id}的用户的密码')
async def update_user_pwd(request: Request, userPwdUpdate: UserPwdUpdate, db: Session = Depends(get_db)):
    """修改用户密码
    
    Args:
        request: 请求对象
        userPwdUpdate: 用户密码更新信息
        db: 数据库会话
        
    Returns:
        更新成功的消息
        
    Raises:
        HTTPException: 如果用户不存在
    """
    db_user = db.query(User).filter(User.id == userPwdUpdate.id).first()
    if db_user is None:
        return R.not_found(msg=f"用户ID {userPwdUpdate.id} 不存在")

    # 更新密码（如果不是占位符）
    if userPwdUpdate.password != "******":
        db_user.userPwd = get_password_hash(userPwdUpdate.password)
        db.commit()
        return R.suc(msg='用户密码更新成功')
    else:
        return R.err(msg='提供的密码无效')


@router.put("/user/role", summary='修改用户角色')
@log_action('修改了ID为{user_id}的用户的角色信息为{role_id}')
async def update_user_role(request: Request, user_id: int, role_id: int, db: Session = Depends(get_db)):
    """修改用户角色
    
    Args:
        request: 请求对象
        user_id: 用户ID
        role_id: 角色ID
        db: 数据库会话
        
    Returns:
        更新成功的消息
        
    Raises:
        HTTPException: 如果用户不存在或角色不存在
    """
    # 检查用户是否存在
    db_user = db.query(User).filter(User.id == user_id).first()
    if db_user is None:
        return R.not_found(msg=f"用户ID {user_id} 不存在")
    
    # 更新用户角色
    try:
        db_user.role_id = role_id
        db.commit()
        return R.suc(msg='用户角色更新成功')
    except pymysql.err.IntegrityError:
        return R.err(msg=f"角色ID {role_id} 不存在")
    except Exception as e:
        return R.server_error(msg=f"更新用户角色失败: {str(e)}")
